import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vite.dev/config/
export default defineConfig(({ mode }) => {
  // 加载环境变量
  const env = loadEnv(mode, process.cwd())
  
  return {
    plugins: [
      vue(),
    ],
    
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      },
    },
    
    // 开发服务器配置
    server: {
      port: 5173,
      host: '0.0.0.0', // 允许外部访问
      open: true, // 自动打开浏览器
      cors: true, // 允许跨域
      proxy: {
        '/api': {
          target: env.VITE_BACKEND_URL || 'http://159.75.68.4:9091',
          changeOrigin: true,
          rewrite: (path) => path,
          configure: (proxy, options) => {
            // 可以在这里配置代理的事件监听
            proxy.on('error', (err, _req, _res) => {
              console.log('代理错误', err)
            })
            proxy.on('proxyReq', (proxyReq, req, _res) => {
              console.log('发送请求:', req.method, req.url)
            })
            proxy.on('proxyRes', (proxyRes, req, _res) => {
              console.log('收到响应:', proxyRes.statusCode, req.url)
            })
          }
        }
      }
    },
    
    // 生产构建配置
    build: {
      outDir: 'dist',
      assetsDir: 'assets',
      sourcemap: mode === 'development', // 开发环境生成 sourcemap
      
      // 代码分割配置
      rollupOptions: {
        output: {
          // 分块策略
          manualChunks: {
            // 将 Vue 相关库单独打包
            'vue-vendor': ['vue', 'vue-router'],
            // 将 axios 单独打包
            'axios-vendor': ['axios'],
          },
          // 资源文件命名
          chunkFileNames: 'assets/js/[name]-[hash].js',
          entryFileNames: 'assets/js/[name]-[hash].js',
          assetFileNames: (assetInfo) => {
            // 根据文件类型分类存放
            const info = assetInfo.name.split('.')
            const ext = info[info.length - 1]
            if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(assetInfo.name)) {
              return `assets/images/[name]-[hash].${ext}`
            } else if (/\.(woff2?|eot|ttf|otf)$/.test(assetInfo.name)) {
              return `assets/fonts/[name]-[hash].${ext}`
            } else if (/\.css$/.test(assetInfo.name)) {
              return `assets/css/[name]-[hash].${ext}`
            }
            return `assets/[name]-[hash].${ext}`
          }
        }
      },
      
      // 压缩配置（使用 Vite 内置的 esbuild，速度更快）
      minify: 'esbuild',
      
      // esbuild 压缩选项
      esbuild: {
        drop: mode === 'production' ? ['console', 'debugger'] : [],
      },
      
      // 如果需要更强的压缩，可以安装 terser 并使用：
      // npm install -D terser
      // minify: 'terser',
      // terserOptions: {
      //   compress: {
      //     drop_console: mode === 'production',
      //     drop_debugger: true,
      //   }
      // },
      
      // 文件大小警告限制（KB）
      chunkSizeWarningLimit: 1000,
      
      // 禁用 CSS 代码分割
      cssCodeSplit: true,
      
      // 构建后是否生成报告
      reportCompressedSize: true,
    },
    
    // 预览服务器配置（npm run preview）
    preview: {
      port: 4173,
      host: '0.0.0.0',
      cors: true,
    },
    
    // 定义全局常量替换
    define: {
      __APP_VERSION__: JSON.stringify(process.env.npm_package_version),
    },
  }
})
